package com.rt.easyjava.base.biz1.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rt.easyjava.base.biz1.bean.TmptData;
import com.rt.easyjava.base.biz1.bean.TmptDataOption;
import com.rt.easyjava.base.biz1.dto.TmptDataDto;
import com.rt.easyjava.base.biz1.dto.TmptDataOptionDto;
import com.rt.easyjava.base.biz1.mapper.TmptDataMapper;
import com.rt.easyjava.base.biz1.mapper.TmptDataOptionMapper;
import com.rt.easyjava.base.biz1.service.intf.TmptDataService;
import com.rt.easyjava.common.base.Result;
import com.rt.easyjava.common.config.dozer.MyMapper;
import com.rt.easyjava.common.utils.others.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 *  服务实现类
 * @author wuxiaoyong
 * @since 2020-05-01
 */
@Service(value = "tmptDataService")
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class TmptDataServiceImpl extends ServiceImpl<TmptDataMapper, TmptData> implements TmptDataService {
    private final Logger logger = LoggerFactory.getLogger(TmptDataServiceImpl.class);

    @Autowired
    private MyMapper mapper;
    @Resource
    private TmptDataMapper tmptDataMapper;
    @Resource
    private TmptDataOptionMapper tmptDataOptionMapper;

    @Autowired
    private TmptDataOptionServiceImpl tmptDataOptionServiceImpl;

    // ==================================================================================
    // ========== 以下使用的是 Mybatis-plus 实现, 适合单表操作 ==============================
    // ==================================================================================

    /**
    * create a object
    * @param tmptDataDto
    * @return
    */
    @Override
    public Result<TmptDataDto> create(TmptDataDto tmptDataDto) {
        Result<TmptDataDto> result = new Result<>();

        // dto to entity
        TmptData tmptData = mapper.map(tmptDataDto, TmptData.class);

        tmptDataMapper.insert(tmptData);

        return result.success();
    }

    /**
    * update a object by Id
    * @param tmptDataDto
    * @param updateWrapper
    * @return
    */
    @Override
    public Result<TmptDataDto> update(TmptDataDto tmptDataDto, Wrapper updateWrapper) {
        Result<TmptDataDto> result = new Result<>();

        // dto to entity
        TmptData tmptData = mapper.map(tmptDataDto, TmptData.class);

        tmptDataMapper.update(tmptData, updateWrapper);

        return result.success();
    }

    /**
    * 分页
    * @param page
    * @param queryWrapper
    * @return
    */
    public Result<TmptDataDto> page(Page<TmptData> page, Wrapper<TmptData> queryWrapper){
        Result<TmptDataDto> result = new Result<>();

        // mapper
        IPage<TmptData> iPage = tmptDataMapper.selectPage(page, queryWrapper);

        // 查询结果转换成DTO
        List<TmptDataDto> tmptDataDtoList= mapper.maplist(iPage.getRecords(), TmptDataDto.class);

        result.getMap().put("total", iPage.getTotal());
        result.getMap().put("rows", tmptDataDtoList);

        return result.success();
    }

    /**
    * select all by queryWrapper
    * @param queryWrapper
    * @return
    */
    @Override
    public Result<TmptDataDto> selectAll(Wrapper<TmptData> queryWrapper) {
        Result<TmptDataDto> result = new Result<>();

        List<TmptData> list = tmptDataMapper.selectList(queryWrapper);

        List<TmptDataDto> dtoList = mapper.maplist(list, TmptDataDto.class);

        return result.setList(dtoList).success();
    }

    /**
    * select one by id
    * @param id
    * @return
    */
    @Override
    public Result<TmptDataDto> selectById(Long id) {
        Result<TmptDataDto> result = new Result<>();

        TmptData tmptData = tmptDataMapper.selectById(id);

        TmptDataDto tmptDatadto = mapper.map(tmptData, TmptDataDto.class);

        return result.setObj(tmptDatadto).success();
    }




    // ==================================================================================
    // ========== 以下使用的是自定义的 mapper.xml 实现, 适合多表查询 =========================
    // ==================================================================================

    /**
    * 分页查询：mybatis plus 自定义sql分页查询
    * @param page
    * @param queryWrapper
    * @return
    */
    @Override
    public Result<TmptDataDto> myPage(Page<TmptData> page, Wrapper<TmptData> queryWrapper) {
        Result<TmptDataDto> result = new Result();

        IPage<TmptData> iPage = tmptDataMapper.myPage(page, queryWrapper);

        //查询结果转换成DTO
        List<TmptDataDto> tmptDataDtoList = mapper.maplist(iPage.getRecords(), TmptDataDto.class);

        result.getMap().put("total", iPage.getTotal());
        result.getMap().put("rows", tmptDataDtoList);

        return result.success();
    }

    @Override
    public Result<TmptDataDto> mySelectBy(Wrapper<TmptData> queryWrapper) {
        Result<TmptDataDto> result = new Result();

        List<TmptData> list = tmptDataMapper.mySelectBy(queryWrapper);
        List<TmptDataDto> dtoList = mapper.maplist(list, TmptDataDto.class);
        result.setList(dtoList);

        return result.success();
    }

    @Override
    public Result<TmptDataDto> mySelectById(long id) {
        Result<TmptDataDto> result = new Result();

        TmptData tmptData = tmptDataMapper.mySelectById(id);
        TmptDataDto dto = mapper.map(tmptData,TmptDataDto.class);
        result.setObj(dto);

        return result.success();
    }

    @Override
    public Result selectBatchIds(List<Integer> idList) {
        List list = tmptDataMapper.selectBatchIds(idList);

        for (int i = 0; i < list.size(); i++) {

            TmptData tmptData = (TmptData) list.get(i);
            QueryWrapper<TmptDataOption> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("tmpt_data_id", tmptData.getId());
            queryWrapper.eq("deleteflag", 0);
            Result<TmptDataOptionDto> tmptDataOptionDtoResult = tmptDataOptionServiceImpl.selectAll(queryWrapper);
            List<TmptDataOptionDto> list1 = tmptDataOptionDtoResult.getList();
            list1.forEach(System.out::println);
            List<TmptDataOption> list2 = mapper.maplist(list1, TmptDataOption.class);
            tmptData.setTmptDataOptionList(list2);
        }

        return Result.builder(list);
    }

    @Override
    public Result insertBankup(List<TmptData> TmptDatas) {

        for (TmptData tmptData : TmptDatas) {
            QueryWrapper<TmptData> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("column_name", tmptData.getColumnName());
            queryWrapper.eq("deleteflag", 0);
            List<TmptData> tmptData1 = tmptDataMapper.selectList(queryWrapper);

            //如果数据库已经有模板就先删除
            if(!StringUtils.isNull(tmptData1)){
                for(int i=0;i<tmptData1.size();i++){
                    TmptData tmptData2 = tmptData1.get(i);

                    TmptDataOption tmptDataOption = new TmptDataOption();
                    tmptDataOption.setDeleteflag(1);
                    UpdateWrapper<TmptDataOption> updateWrapper = new UpdateWrapper<>();
                    updateWrapper.eq("tmpt_data_id", tmptData2.getId());
                    tmptDataOptionMapper.update(tmptDataOption,updateWrapper);

                    tmptData2.setDeleteflag(1);
                    UpdateWrapper<TmptData> updateWrapper1 = new UpdateWrapper<>();
                    updateWrapper1.eq("id", tmptData2.getId());
                    tmptDataMapper.update(tmptData2,updateWrapper1);
                }
            }

            tmptDataMapper.insert(tmptData);

            Long id = tmptData.getId();
            List<TmptDataOption> tmptDataOptionList = tmptData.getTmptDataOptionList();
            for (TmptDataOption tmptDataOption : tmptDataOptionList) {
                tmptDataOption.setTmptDataId(id);
                tmptDataOptionMapper.insert(tmptDataOption);
            }

        }

        return Result.builder("success");
    }


}
